{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 同步与锁管理\n",
    "\n",
    "| Idiom                           | 核心思想                 | 简要说明                                                     |\n",
    "| ------------------------------- | ------------------------ | ------------------------------------------------------------ |\n",
    "| **RAII Lock Guard**（作用域锁） | 构造即加锁，析构自动解锁 | 使用 `std::lock_guard`, `std::unique_lock`, `std::scoped_lock` 等，避免遗漏解锁和异常导致的资源泄漏。 |\n",
    "| **Lock Ordering**（锁顺序协议） | 统一锁获取顺序           | 避免死锁的经典策略：在全局范围内规定多把锁的获取顺序。       |\n",
    "| **Try-Lock-and-Backoff**        | 非阻塞尝试 + 退避        | 使用 `try_lock()` 判断锁是否可用，不成功则退避重试，避免线程长时间阻塞。 |\n",
    "| **Lock Striping / 分段锁**      | 多把锁拆分热点           | 对容器按片区或哈希分段加锁，降低单锁竞争。                   |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据共享与生命周期管理\n",
    "\n",
    "| Idiom                               | 核心思想                            | 简要说明                                                     |\n",
    "| ----------------------------------- | ----------------------------------- | ------------------------------------------------------------ |\n",
    "| **Copy-On-Write / RCU 风格**        | 写时复制，读持快照                  | 前面讨论的 `shared_ptr` + `unique()` 判定，是读多写少场景的经典解法。 |\n",
    "| **Thread-Safe Singleton**           | 双重检查锁 + `std::atomic`          | 利用 `std::atomic_thread_fence` 或 C++11 的静态局部变量初始化保证线程安全。 |\n",
    "| **Thread-Safe Lazy Initialization** | `std::call_once` / `std::once_flag` | 确保初始化逻辑只执行一次，避免竞态。                         |\n",
    "| **Hazard Pointer / Epoch GC**       | 延迟回收无锁数据结构中的节点        | Lock-free 结构中常用，读者登记“危险指针”以防提前释放。       |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 工作调度与任务管线\n",
    "\n",
    "| Idiom                           | 核心思想                     | 简要说明                                                     |\n",
    "| ------------------------------- | ---------------------------- | ------------------------------------------------------------ |\n",
    "| **Thread Pool**                 | 固定线程重复执行任务         | 利用工作队列 + 条件变量实现，避免频繁创建线程。              |\n",
    "| **Active Object / Actor**       | 每个对象独占线程处理消息     | 通过队列向对象发送消息，内部线程串行处理，隔离共享数据。     |\n",
    "| **Producer-Consumer Queue**     | 条件变量 + 循环队列          | `std::condition_variable` 配合 `std::mutex` 实现阻塞式队列，常见于日志、IO 管线。 |\n",
    "| **SPSC / MPMC Lock-Free Queue** | 单/多生产者-消费者无锁队列   | 使用环形缓冲区和原子操作提升吞吐（如 Boost.Lockfree、folly 结构）。 |\n",
    "| **Work Stealing**               | 线程拥有私有队列，空闲时窃取 | C++17 `std::experimental::parallel`、TBB 等使用，提升负载平衡。 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 内存顺序与原子操作\n",
    "\n",
    "| Idiom                                         | 核心思想                        | 简要说明                                                     |\n",
    "| --------------------------------------------- | ------------------------------- | ------------------------------------------------------------ |\n",
    "| **Atomic Counters / Flags**                   | 使用 `std::atomic` 替代锁       | 计数器、状态机等轻量同步场景，避免互斥锁开销。               |\n",
    "| **Memory Fence 补全**                         | 结合 `std::atomic_thread_fence` | 在自定义同步原语中确保有序性，类似 C11/C++11 的 acquire-release 语义。 |\n",
    "| **Double-Checked Locking with `std::atomic`** | 初始化前后使用 Acquire/Release  | 现代 C++ 正确实现双重检查锁需原子指针 + 内存序。             |\n",
    "| **Seqlock（顺序锁）**                         | 写加锁，读乐观重试              | 维护一个版本号，写入时加锁并递增，读者检查版本一致性，常见于配置读取。 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 结构化并发（C++20 及之后）\n",
    "\n",
    "| Idiom                              | 核心思想                     | 简要说明                                                     |\n",
    "| ---------------------------------- | ---------------------------- | ------------------------------------------------------------ |\n",
    "| **Futures / Promises**             | `std::async`, `std::promise` | 建立异步任务结果的依赖关系，通过 `future.get()` 同步结果。   |\n",
    "| **Coroutine-based Pipeline**       | 协程与调度器结合             | 使用 `co_await` 构建异步链路，在 GUI、网络 IO 中简化回调地狱。 |\n",
    "| **std::jthread + Stop Token**      | 协作取消                     | C++20 `std::jthread` 自动 join，配合 `std::stop_token` 实现任务终止。 |\n",
    "| **Structured Concurrency**（提案） | 作用域封闭的任务集           | P2300 等提案强调任务生命周期跟随作用域，避免“野生线程”。     |"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
